Arduino IIC 主从设备连接通信

您所在的位置:网站首页 arduino i2c通信 Arduino IIC 主从设备连接通信

Arduino IIC 主从设备连接通信

#Arduino IIC 主从设备连接通信| 来源: 网络整理| 查看: 265

 

 

目的:

       实现Arduino主从设备之间的互相IIC通信,掌握IIC通信协议的使用方法。

器材:

Arduino UNO R3 一块

Arduino Nano 三块

面包板   导线

3K电阻 2个

连接方法:

    由于Arduino IIC接口总线没有上拉电阻,在连接布线时需要提供两个上拉电阻。

 

首先给出程序:

Master程序

   #include

void setup() {

  Wire.begin(); // join i2cbus (主机,不用写IIC地址)

  Serial.begin(9600); // 串口输出

 }

 

int i = 1;

 

 void loop()

 {

     //向从机写入数据

     Wire.beginTransmission(2);

     Wire.write(i);

     Wire.endTransmission();

     //读数据

     Wire.requestFrom(2, 6); // 要求2号IIC设备,通过Wire传送 6个 char过来

     while(Wire.available()) // 如果Wire上有 char 等读取

     {

           char c = Wire.read(); // 从Wire 上读取一个char

            Serial.print(c); //输出到串口监视器查看

     }

     delay(2000); // 等2秒

     Serial.println( ); // 输出到下一行方便查看        

     

     //向从机写入数据

     Wire.beginTransmission(3);

     Wire.write(i);

     Wire.endTransmission();

     //读数据

     Wire.requestFrom(3, 6); // 要求2号IIC设备,通过Wire传送 6个 char过来

     while(Wire.available()) // 如果Wire上有 char 等读取

     {

           char c = Wire.read(); // 从Wire 上读取一个char

            Serial.print(c); //输出到串口监视器查看

     }

      delay(2000); // 等2秒

      Serial.println( ); // 输出到下一行方便查看            

    

     //向从机写入数据

     Wire.beginTransmission(4);

     Wire.write(i);

     Wire.endTransmission();

     //读数据

     Wire.requestFrom(4, 6); // 要求2号IIC设备,通过Wire传送 6个 char过来

     while(Wire.available()) // 如果Wire上有 char 等读取

     {

           char c = Wire.read(); // 从Wire 上读取一个char

            Serial.print(c); //输出到串口监视器查看

     }

      delay(2000); // 等2秒

      Serial.println( ); // 输出到下一行方便查看      

    

     i++;

     i = i%4;

  

 }// loop

 

 

SALVE程序

#include

void ggyy();

//接收主机命令

int revData = 0;

void receiveData(int byteCount) {  

  while (Wire.available()) {

    int number = Wire.read();

    Serial.print("data received1: ");

    Serial.println(number);

    revData = number;

    } 

 

void setup()

{

  Wire.begin(3); //通知IIC总线, 是2 号IIC设备地址

  Wire.onReceive(receiveData);

  Wire.onRequest(ggyy); // 注册当收到主机信息时相应的调用函数ggyy( )

  Serial.begin(9600);

  pinMode(13,OUTPUT);

  digitalWrite(13,LOW);

}

void loop()

{ // 从机,代码空

      int b = revData;

      revData = 0;

      for(int i = 0; i < b; i++){

      digitalWrite(13,HIGH);

      delay(200);

      digitalWrite(13,LOW);

      delay(200);

    }

}

// 信息处理函数,必须在 setup( ) 內用onRequest( ) 注册

void ggyy()

{

  Wire.write("World "); // 送出 6 个char给IC 上的主机

}

 

 

程序要点分析:

Master程序用Wire.begin();设置,表示本机为Master   主机向从机写入数据格式

     Wire.beginTransmission(从机地址号);

     Wire.write(数据byte);

     Wire.endTransmission();

Master从Salve读数据

     Wire.requestFrom(从机地址, 字符个数);

     while(Wire.available()) // 如果Wire上有 char 等读取

     {

           char c = Wire.read(); // 从Wire 上读取一个char

            Serial.print(c); //输出到串口监视器查看

     }

SLAVE用Wire.begin(地址号)表示本机为SLAVE,并设置地址号

5.  注册用于接收和发送的函数

Wire.onReceive(receiveData);

     Wire.onRequest(sendData);

两个函数的格式:

void receiveData(int byteCount);

void sendData ();

 

当主机发出requestForm请求时,从机响应,开始发送数据

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3